package com.example.algorithm.huawei_rongyao_29;

import java.util.Scanner;

// 数组中两个字符串的最小距离
// 难度：中等
/**
 * 给定一个字符串数组strs，再给定两个字符串str1和str2，返回在strs中str1和str2的最小距离。
 * 如果str1或str2为null，或不在strs中，返回-1。
 * <p>
 * 输入描述:
 * 输入包含有多行，第一输入一个整数n,1<=10<=10的5次方，代表数组strs的长度，
 * 第二行有两个字符串分别代表str1和str2
 * 接下来n行，每行一个字符串，代表数组strs (保证题目中出现的所有字符串长度均小于等于10)。
 * <p>
 * 输出描述:
 * 输出一行，包含一个整数，代表返回的值。
 * <p>
 * 示例1
 * 输入
 * 1 数组长度
 * CD AB 需要计算距离的两个目标字符串
 * CD 数组的单个元素
 * <p>
 * 输出
 * -1
 * <p>
 * 示例2
 * 输入
 * 5
 * QWER 666
 * QWER
 * 1234
 * qwe
 * 666
 * QWER
 * <p>
 * 输出
 * 1
 * <p>
 * 实现思路
 * 输入处理：读取输入数据，包括数组长度 n，字符串 str1 和 str2，以及数组 strs。
 * 初步检查：如果 str1 或 str2 为空，或者它们不在数组 strs 中，直接返回 -1。
 * 遍历数组：遍历数组，记录 str1 和 str2 出现的索引位置，每次更新位置后计算当前的距离，并更新最小距离。(还是打擂台思想)
 * 返回结果：返回计算出的最小距离。
 *
 * 实际测试此程序正确
 */
public class Q22_MinDistanceBetweenStrings {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        int n = scanner.nextInt();
        String str1 = scanner.next();
        String str2 = scanner.next();

        scanner.nextLine(); // consume the remaining newline

        String[] strs = new String[n];
        for (int i = 0; i < n; i++) {
            strs[i] = scanner.nextLine();
        }

        System.out.println(minDistance(strs, str1, str2));
    }

    private static int minDistance(String[] strs, String str1, String str2) {

        // 初步比较，目标值为空，返回-1
        if (str1 == null || str2 == null) {
            return -1;
        }

        int index1 = -1;
        int index2 = -1;
        int minDistance = Integer.MAX_VALUE; // 因为后续用min，所以这里初始值就得设置成最大整数

        for (int i = 0; i < strs.length; i++) {
            if (strs[i].equals(str1)) {
                index1 = i;
                if (index2 != -1) {
                    // 这句代码 Math.abs(index1 - index2) 用于计算两个数 index1 和 index2 之间的绝对值。
                    // 应为index1和index2谁大谁小不知道
                    minDistance = Math.min(minDistance, Math.abs(index1 - index2));
                }
            }
            if (strs[i].equals(str2)) {
                index2 = i;
                if (index1 != -1) { // 等于-1代表index还是在初始值，进一步说明，其实，strs数组中没有找到匹配str2的元素。那自然不会有距离。
                    minDistance = Math.min(minDistance, Math.abs(index1 - index2));
                }
            }
        }

        // 如果最后，上面的for走完了，只要index1、index2中只要其中一个为-1，那表示就有一个没有在数组中匹配。那自然没法比较距离了。
        if (index1 == -1 || index2 == -1) {
            return -1;
        }

        return minDistance;
    }
}




